// middleware.js
// Next.js 中间件，用于处理国际化路由和静态文件
import { NextResponse } from 'next/server';

// 支持的语言列表
const LOCALES = ['en', 'zh'];

/**
 * 获取用户偏好的语言
 * 优先级：Cookie > Accept-Language 头 > 默认语言
 * @param {Request} request - 请求对象
 * @returns {string} 语言代码
 */
function getPreferredLocale(request) {
  // 1. 首先检查用户设置的 Cookie
  const localeCookie = request.cookies.get('NEXT_LOCALE')?.value;
  if (localeCookie && LOCALES.includes(localeCookie)) {
    return localeCookie;
  }

  // 2. 检查浏览器的 Accept-Language 头
  const acceptLanguage = request.headers.get('Accept-Language');
  if (acceptLanguage) {
    // 取第一个语言偏好，去掉地区代码（如 zh-CN -> zh）
    const preferredLocale = acceptLanguage.split(',')[0].split('-')[0];
    if (LOCALES.includes(preferredLocale)) {
      return preferredLocale;
    }
  }

  // 3. 默认返回英语
  return 'en';
}

/**
 * Next.js 中间件主函数
 * 处理国际化路由重定向和静态文件过滤
 * @param {Request} request - 请求对象
 * @returns {NextResponse} 响应对象
 */
export function middleware(request) {
  const pathname = request.nextUrl.pathname;

  // 1. 静态文件处理：直接放行，不进行语言处理
  if (
    pathname.endsWith('.xml') ||    // RSS 和站点地图
    pathname.endsWith('.js') ||     // JavaScript 文件
    pathname.endsWith('.json') ||   // JSON 文件
    pathname.endsWith('.csv') ||    // CSV 数据文件
    pathname.endsWith('.xlsx') ||   // Excel 文件
    pathname.endsWith('.docx') ||   // Word 文档
    pathname.endsWith('.txt') ||    // 文本文件
    pathname.endsWith('.ico') ||    // 图标文件
    pathname.endsWith('.png')       // 图片文件
  ) {
    return NextResponse.next();
  }

  let response;
  
  // 2. 根路径处理：重定向到默认语言页面
  if (pathname === '/') {
    const preferredLocale = getPreferredLocale(request);
    // 重定向到 /{lang}/algorithms 页面
    response = NextResponse.redirect(new URL(`/${preferredLocale}/algorithms`, request.url));
  } else {
    // 3. 检查路径是否缺少语言前缀
    const pathnameIsMissingLocale = LOCALES.every(
      (locale) => !pathname.startsWith(`/${locale}/`) && pathname !== `/${locale}`
    );
    
    if (pathnameIsMissingLocale) {
      // 缺少语言前缀，添加用户偏好语言
      const preferredLocale = getPreferredLocale(request);
      response = NextResponse.redirect(new URL(`/${preferredLocale}${pathname}/`, request.url));
    } else {
      // 已有语言前缀，直接放行
      response = NextResponse.next();
    }
  }

  // 4. 添加自定义响应头
  if (response) {
    response.headers.set('x-pathname', pathname); // 记录原始路径
  } else {
    response = NextResponse.next();
    response.headers.set('x-pathname', pathname);
  }

  // 5. 设置 SEO 相关的响应头
  response.headers.set('X-Robots-Tag', 'index,follow');
  return response;
}

// 中间件配置：指定哪些路径需要经过中间件处理
export const config = {
  matcher: [
    /*
     * 匹配所有请求路径，除了以下开头的路径：
     * - api (API 路由)
     * - _next/static (Next.js 静态文件)
     * - _next/image (Next.js 图片优化文件)
     * - robots.txt (搜索引擎爬虫文件)
     */
    '/((?!api|_next/static|_next/image|robots.txt).*)',
  ],
};
